package refunds

import (
	"jlpay-sdk-go/pkg/jlpay/core"
	"jlpay-sdk-go/pkg/jlpay/models"
)

// ==================== 退款查询请求 ====================

// RefundsQueryRequest 退款查询请求
type RefundsQueryRequest struct {
	models.OrgBaseRequest
	// MchID 商户号
	MchID string `json:"mch_id,omitempty"`
	// TransactionID 平台订单号
	TransactionID string `json:"transaction_id,omitempty"`
	// OutTradeNo 外部订单号
	OutTradeNo string `json:"out_trade_no,omitempty"`
	// 原始请求映射数据
	rawRequestMap map[string]interface{} `json:"-"`
}

// NewRefundsQueryRequest 创建退款查询请求
func NewRefundsQueryRequest() *RefundsQueryRequest {
	return &RefundsQueryRequest{}
}

// SetMchID 设置商户号
func (r *RefundsQueryRequest) SetMchID(mchID string) *RefundsQueryRequest {
	r.MchID = mchID
	return r
}

// SetTransactionID 设置平台订单号
func (r *RefundsQueryRequest) SetTransactionID(transactionID string) *RefundsQueryRequest {
	r.TransactionID = transactionID
	return r
}

// SetOutTradeNo 设置外部订单号
func (r *RefundsQueryRequest) SetOutTradeNo(outTradeNo string) *RefundsQueryRequest {
	r.OutTradeNo = outTradeNo
	return r
}

// SetRawRequestMap 设置原始请求映射数据
func (r *RefundsQueryRequest) SetRawRequestMap(rawMap map[string]interface{}) *RefundsQueryRequest {
	r.rawRequestMap = rawMap
	return r
}

// GetRawMap 获取原始映射数据
func (r *RefundsQueryRequest) GetRawMap() (map[string]interface{}, bool) {
	return r.rawRequestMap, r.rawRequestMap != nil
}

// ToMap 转换为map
func (r *RefundsQueryRequest) ToMap() (map[string]interface{}, error) {
	// 如果有原始映射数据，直接返回
	if rawMap, exists := r.GetRawMap(); exists {
		return rawMap, nil
	}

	// 构建基础请求数据
	requestMap := make(map[string]interface{})

	// 添加基础字段
	if r.MchID != "" {
		requestMap["mch_id"] = r.MchID
	}
	if r.TransactionID != "" {
		requestMap["transaction_id"] = r.TransactionID
	}
	if r.OutTradeNo != "" {
		requestMap["out_trade_no"] = r.OutTradeNo
	}

	// 合并基础请求数据
	baseMap, err := r.OrgBaseRequest.ToMap()
	if err != nil {
		return nil, err
	}

	for k, v := range baseMap {
		requestMap[k] = v
	}

	return requestMap, nil
}

// CheckRequiredParams 检查必需参数
func (r *RefundsQueryRequest) CheckRequiredParams(config *core.Config) error {
	return r.OrgBaseRequest.CheckRequiredParams(config)
}

// ==================== 退款查询响应 ====================

// RefundsQueryResponse 退款查询响应
type RefundsQueryResponse struct {
	models.StandardResponse
	// Status 状态 1：待确认 2：成功 3：失败
	Status string `json:"status,omitempty"`
	// MchID 商户号
	MchID string `json:"mch_id,omitempty"`
	// TransactionID 平台订单号
	TransactionID string `json:"transaction_id,omitempty"`
	// OutTradeNo 外部订单号
	OutTradeNo string `json:"out_trade_no,omitempty"`
	// ChnTransactionID 渠道订单号
	ChnTransactionID string `json:"chn_transaction_id,omitempty"`
	// OriOutTradeNo 原外部订单号
	OriOutTradeNo string `json:"ori_out_trade_no,omitempty"`
	// OriTransactionID 原平台订单号
	OriTransactionID string `json:"ori_transaction_id,omitempty"`
	// TransTime 交易时间
	TransTime string `json:"trans_time,omitempty"`
	// SuccessTime 退款完成时间
	SuccessTime string `json:"success_time,omitempty"`
}

// NewRefundsQueryResponse 创建退款查询响应
func NewRefundsQueryResponse() *RefundsQueryResponse {
	return &RefundsQueryResponse{}
}
